#给定一个大文件生成代码。 查找出文件中最长的行，输出长度
"""
考虑文件比较大
考虑代码精简
"""
# #生成大文件
# import string
# import random
#
#
# with open ("big.data","w+",encoding = "utf-8") as fp:
#     fp.write("aaaaaaaaaaaaaaaaaa\n"*10**7)
#     fp.write(("".join(random.choices(string.ascii_lowercase, k = random.randint(1,50)))+"\n"))

#生成器输出最长行行数
print(max(len(line.strip()) for line in open(r"E:\python\lecture2\.idea\sc\big.data")))


#输出两个日期，计算两个日期之间相差的天数
import datetime

print("输入示范：2021,07,29")
year1,month1,day1 = input("请输入较早的日期（以逗号分隔，不能有多余输入）：").split(",")
year2,month2,day2 = input("请输入较晚的日期（以逗号分隔，不能有多余输入）：").split(",")


ear_time = datetime.date(int(year1),int(month1),int(day1))
lat_time = datetime.date(int(year2),int(month2),int(day2))

print((lat_time - ear_time).days)


#输入一个数字n，计算n天之前是什么日期，输出日期形式为"2021-07-27# "
import datetime
n = int(input("你要查看几天前的日期："))
print((datetime.datetime.now() - datetime.timedelta(days = n)).strftime("%Y-%m-%d")) #只输出日期


#统计当前文件夹的大小
import os
import os.path
file_list = []
def get_size(file_path):
    fileList = os.listdir(file_path)  # 获取file_path目录下所有文件
    for filename in fileList:
        path_Tmp = os.path.join(file_path,filename)  # 获取file_path与filename组合后的路径 TMP添加路径
        if os.path.isdir(path_Tmp):   # 判断是否为目录
            get_size(path_Tmp)        # 是目录就继续递归查找
        elif os.path.isfile(path_Tmp):  # 判断是否为文件
            filesize = os.path.getsize(path_Tmp)  # 如果是文件，则获取相应文件的大小
            print('目录中的子文件大小：%d字节' % filesize)
            file_list.append(filesize)      # 将文件的大小添加到列表
    #print(sum(list1))

#list1 = [11,33,55,66]
file_path = input("输入路径：").strip()  #由用户指定文件路径
get_size(file_path)
print('目录中的文件总大小：%d字节' % sum(file_list))


#怎么判断一个对象是可迭代对象，迭代器或生成器
"""
①一个对象如果实现了__iter__方法就是可迭代对象
②在实现了__iter__方法的基础上再实现了__next__方法就是迭代器，迭代器也是个可迭代对象
③以yield关键字返回对象的的函数叫做生成器函数，调用这类函数时返回的对象就是生成器，生成器
是一种特殊的迭代器，它自动实现了"迭代器协议"（即__iter__方法和__next__方法）
（生成器再迭代的时候可以修改当前迭代值，而修改普通迭代器的当前迭代值往往会发生异常）
"""

#迭代器与生成器的区别
"""
①迭代器和生成器都实现了迭代器协议，生成器本质上是一种迭代器，都是用于迭代操作，唯一的区别是二者的实现方式不同，生成器对一个可迭代
对象实现iter()就生成了迭代器，调用生成器函数时形成生成器。
"""

#可迭代对象和迭代器的区别
"""
可迭代对象不一定是个迭代器，迭代器一定是个可迭代对象，可迭代对象是需要实现__iter__方法，返回一个可迭代器对象，迭代器
需要同时实现__iter__和__next__。
"""

#如何定义一个生成器
"""
在Python中，一边循环一边计算的机制，称为生成器：generator
①生成器推断式：把一个列表生成式的[]改成()，就创建了一个generator 生成器 
    g = (x * x for x in range(10))
    print(g)
    <generator object <genexpr> at 0x00000211ECDF7BA0>
②通过调用以yield关键字返回值的生成器函数来创建以一个generator生成器
"""

#如何获取可迭代对象、迭代器与生成器中的数据
"""
①for循环依次获取可迭代对象里的值。列表、元组和字符串可以通过索引获取数据,字典可以通过key值获取对应的value值，集合?
②迭代器可以通过 next()方法不断重复获取下一个值，直到所有元素全部输出完之后，返回 StopIteration才停止。
③可用next()调用生成器对象来取值。next 两种方式 t.next() | next(t)。可用for 循环获取返回值（每执行一次，取生成器里面一个值）
（基本上不会用next()来获取下一个返回值，而是直接使用for循环来迭代）
"""
